<?php

// 严格模式
declare(strict_types=1);

// 命名空间
namespace Kingbes\Gui;

// 引入文件
use Kingbes\Raylib\Core; // 核心
use Kingbes\Raylib\Textures; // 纹理
use Kingbes\Raylib\Utils; // 工具

class Ui
{
    /**
     * 布局
     *
     * @var array
     */
    private $body_view = [];

    /**
     * 构造函数
     *
     * @param string $title 窗口标题
     * @param integer $width 窗口宽度
     * @param integer $height 窗口高度
     */
    public function __construct(
        private string $title = "Ui",
        private int $width = 800,
        private int $height = 600
    ) {
        // 初始化窗口
        Core::InitWindow($this->width, $this->height, $this->title);
        Core::SetTargetFPS(60); // 设置目标帧率为60
    }

    /**
     * 获取窗口标题
     *
     * @return string
     */
    public function getTitle(): string
    {
        return $this->title;
    }

    /**
     * 设置窗口标题
     *
     * @param string $title 窗口标题
     * @return self
     */
    public function setTitle(string $title): self
    {
        $this->title = $title;
        Core::setWindowTitle($title);
        return $this;
    }

    /**
     * 设置窗口图标
     *
     * @param string $path 图标路径
     * @return self
     */
    public function setIcon(string $path): self
    {
        $icon = Textures::loadImage($path);
        Core::setWindowIcon($icon);
        Textures::unloadImage($icon);
        return $this;
    }

    /**
     * 设置字体
     *
     * @param string $path 字体路径
     * @return self
     */
    public function setFont(string $path): self
    {
        Font::file($path);
        return $this;
    }

    /**
     * 设置窗口大小
     *
     * @param integer $width 窗口宽度
     * @param integer $height 窗口高度
     * @return self
     */
    public function setSize(int $width, int $height): self
    {
        $this->width = $width;
        $this->height = $height;
        Core::setWindowSize($width, $height);
        return $this;
    }

    /**
     * 获取窗口宽度
     *
     * @return integer
     */
    public function getWidth(): int
    {
        return $this->width;
    }

    /**
     * 获取窗口高度
     *
     * @return integer
     */
    public function getHeight(): int
    {
        return $this->height;
    }

    /**
     * 设置框架布局
     *
     * @return self
     */
    public function body(...$body): self
    {
        $this->body_view = $body;
        return $this;
    }

    /**
     * 等待
     *
     * @return void
     */
    public function wait(): void
    {
        $bg_color = Utils::color(255, 255, 255); // 默认背景颜色
        Font::load(); // 加载字体
        while (!Core::WindowShouldClose()) {
            /* 布局事件 */

            Core::beginDrawing(); //开始绘制
            Core::clearBackground($bg_color); // 清除背景
            /* 布局绘画 */
            foreach ($this->body_view as $view) {
                $view->draw();
            }
            Core::endDrawing(); // 结束绘制
        }
        Core::CloseWindow();
    }
}
